package com.wb.structual.decorator;

import com.wb.structual.decorator.general.Component;
import com.wb.structual.decorator.general.ConcreteComponent;
import com.wb.structual.decorator.general.ConcreteDecoratorA;

/**
 * 通常情况下，扩展一个类的功能会使用继承方式来实现。
 * 但继承具有静态特征，耦合度高，并且随着扩展功能的增多，
 * 子类会很膨胀。
 * 如果使用组合关系来创建一个包装对象（即装饰对象）来包裹真实对象，
 * 并在保持真实对象的类结构不变的前提下，为其提供额外的功能，
 * 这就是装饰器模式的目标。下面来分析其基本结构和实现方法。
 *
 * @author 魏彪
 */
public class DecoratorTest01 {

    public static void main(String[] args) {
//        Component component = new ConcreteComponent();
//        ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(component);
//        decoratorA.operation();
        new RobotDecorator(new FirstRobot()).doSomething();
    }
}

interface Robot {
    void doSomething();
}

class FirstRobot implements Robot {

    @Override
    public void doSomething() {
        System.out.println("对话");
        System.out.println("唱歌");
    }
}

// 定义装饰器对第一代机器人进行扩展
class RobotDecorator implements Robot {

    /**
     * 对哪个对象进行装饰
     */
    private Robot robot;

    public RobotDecorator(Robot robot) {
        this.robot = robot;
    }

    @Override
    public void doSomething() {
        robot.doSomething();
        // 实现了装饰器
        doMoreThing();
    }

    public void doMoreThing() {
        System.out.println("做更多的事情");
    }
}
